int sprit_index=0;
typedef struct Sprite{
	int id;
	char*name;//示 DisplayObject 的实例名称。 DisplayObject 
	float width;//示显示对象的宽度，以像素为单位。 DisplayObject 
	float height;//示显示对象的高度，以像素为单位。 DisplayObject 
	float x;//示 DisplayObject 实例相对于父级 DisplayObjectContainer 本地坐标的 x 坐标。 DisplayObject 
	float y;//示 DisplayObject 实例相对于父级 DisplayObjectContainer 本地坐标的 y 坐标。 DisplayObject 
	float z;//示 DisplayObject 实例相对于 3D 父容器沿 z 轴的 z 坐标位置。 
	float scaleX;//示从注册点开始应用的对象的水平缩放比例（百分比）。 DisplayObject 
	float scaleY;//示从对象注册点开始应用的对象的垂直缩放比例（百分比）。 DisplayObject 
	float scaleZ;//示从对象的注册点开始应用的对象的深度缩放比例（百分比）。 DisplayObject 
	float rotationX;//示 DisplayObject 实例相对于 3D 父容器距离其原始方向的 x 轴旋转（以度为单位）。 DisplayObject 
	float rotationY;//示 DisplayObject 实例相对于 3D 父容器距离其原始方向的 y 轴旋转（以度为单位）。 DisplayObject 
	float rotationZ;//示 DisplayObject 实例相对于 3D 父容器距离其原始方向的 z 轴旋转（以度为单位）。 DisplayObject 
	int numChildren;//只读] 返回此对象的子项数目。 DisplayObjectContainer 
	Sprite *parent;//只读] 指示包含此显示对象的 DisplayObjectContainer 对象。 DisplayObject 
	Sprite *children;
	Sprite *next;
	Sprite *prev;
	int visible;//示对象是否可见。 DisplayObject 
	int buttonMode; //定此 sprite 的按钮模式。 Sprite 
	float   alpha; //示指定对象的 Alpha 透明度值。 DisplayObject 
	SDL_surface graphics;//只读] 指定属于此 sprite 的 Graphics 对象，在此 sprite 中可执行矢量绘画命令。 Sprite 
	int mask; //用显示对象被指定的 mask 对象遮罩。 DisplayObject 
	int	mouseEnabled; //定此对象是否接收鼠标或其他用户输入、消息。 InteractiveObject 
	int mouseChildren; //定对象的子级是否支持鼠标或用户输入设备。 DisplayObjectContainer 
	int	mouseX;//只读] 指示此鼠标或用户输入设备位置的 x 坐标，以像素为单位。 DisplayObject 
	int mouseY;//只读] 指示此鼠标或用户输入设备位置的 y 坐标，以像素为单位。 DisplayObject 
	int startDrag;
	SDL_rectangle drag_rect;
	int numEvents;
	int *events;
	//int   blendMode; //lendMode 类中的一个值，用于指定要使用的混合模式。 DisplayObject 
	//int   blendShader; //只写] 设置用于混合前景和背景的着色器。 DisplayObject 
	//int   cacheAsBitmap; //果设置为 true，则 Flash 运行时将缓存显示对象的内部位图表示形式。 DisplayObject 
	//int useHandCursor;//尔值，表示当指针滑过 buttonMode 属性设置为 true 的 sprite 时是否显示指针手形（手形光标）。 Sprite 
	//Matrix cacheAsBitmapMatrix; //果为非 null，则 Matrix 对象会定义显示对象在 cacheAsBitmap 设置为 true 时的呈现方式。 DisplayObject 
	//contextMenu : NativeMenu //定与此对象相关联的上下文菜单。 InteractiveObject 
	//int doubleClickEnabled;//定此对象是否接收 doubleClick 事件。 InteractiveObject 
	//int dropTarget;//只读] 指定拖动 sprite 时经过的显示对象，或放置 sprite 的显示对象。 Sprite 
	//int filters[];//含当前与显示对象关联的每个滤镜对象的索引数组。 DisplayObject 
	//focusRect : Object; //定此对象是否显示焦点矩形。 InteractiveObject 
	//hitArea : Sprite //定一个 sprite 用作另一个 sprite 的点击区域。 Sprite 
	//loaderInfo : LoaderInfo; //只读] 返回一个 LoaderInfo 对象，其中包含加载此显示对象所属的文件的相关信息。 DisplayObject 
	//opaqueBackground : Object //定显示对象是否由于具有某种背景颜色而不透明。 DisplayObject 
	//prototype : Object //静态] 对类或函数对象的原型对象的引用。 Object 
	//root : DisplayObject //只读] 对于加载的 SWF 文件中的显示对象，root 属性是此 SWF 文件所表示的显示列表树结构部分中的顶级显示对象。 DisplayObject 
	//rotation : Number //示 DisplayObject 实例距其原始方向的旋转程度，以度为单位。 DisplayObject 
	//scale9Grid : Rectangle //前有效的缩放网格。 DisplayObject 
	//SDL_rectangle scrollRect;//示对象的滚动矩形范围。 DisplayObject 
	//int soundTransform;//制此 sprite 中的声音。 Sprite 
	//stage : Stage //只读] 显示对象的舞台。 DisplayObject 
	//tabChildren : Boolean //定对象的子项是否支持 Tab 键。 DisplayObjectContainer 
	//tabEnabled : Boolean //定此对象是否遵循 Tab 键顺序。 InteractiveObject 
	//tabIndex : int //定 SWF 文件中的对象按 Tab 键顺序排列。 InteractiveObject 
	//textSnapshot : flash.text:TextSnapshot //只读] 返回此 DisplayObjectContainer 实例的 TextSnapshot 对象。 DisplayObjectContainer 
	//int transform;//个对象，具有与显示对象的矩阵、颜色转换和像素范围有关的属性。 DisplayObject 

} Sprite;
Sprite*Sprite_constructor(Sprite*this)
{
	this->id = ++sprit_index;
	this->visible =1;
	this->alpha=1.0;
	this->mouseEnabled=1;
}

int *Sprite_contains(Sprite*this,Sprite*child)
{
	if(this==NULL){
		printf("no parent");
		return 0;
	}
	if(child==NULL){
		printf("no child");
		return 0;
	}
	if(this->children==NULL)
		return 0;
	if(child->parent==this)
		return 1;
	Sprite* _parent=child->parent;
	while(_parent){
		if(_parent==this)
			return 1;
		_parent=_parent->parent;
	}
	return 0;
}

Sprite*Sprite_addChild(Sprite*this,Sprite*child)
{
	if(this==NULL){
		printf("no parent");
		return NULL;
	}
	if(child==NULL){
		printf("no child");
		return NULL;
	}
	if(this==child->parent){
		return child;
	}
	child.parent=this;
	child->next=null;
	if(this->children==NULL){
		this->children=child;
		this->numChildren=1;
		child->prev=null;
	}else{
		this->numChildren+=1;
		Sprite*_child=this->children;
		while(_child->next){
			_child=_child->next;
		}
		_child->next=child;
		child->prev=_child;
	}
	return child;
}
Sprite*Sprite_getChildAt(Sprite*this,int i)
{
	if(this->numChildren>i && i>=0){
		Sprite*_child=this->children;
		int _i=0;
		while(_i<i){
			++_i;
			_child=_child->next;
		}
		return _child;
	}
	return NULL;
}
Sprite*Sprite_removeChild(Sprite*this,Sprite*child)
{
	if(this==NULL){
		printf("no parent");
		return NULL;
	}
	if(child==NULL){
		printf("no child");
		return NULL;
	}
	if(child->parent==this){
		child->parent=NULL;
		this->numChildren-=1;
		if(child->prev)child->prev->next=child->next;
		else this->children=child;

		child->prev=0;
		child->next=0;
		return child;
	}
	return NULL;
}
Sprite*Sprite_getChildByName(Sprite*this,const char*name)
{
	if(this && this->numChildren>0 && name && strlen(name)>0){
		printf("no parent");
		Sprite*_child=this->children;
		while(_child){
			if(strcmp(_child->name,name)==0)
				return _child;
			_child=_child->next;
		}
		return NULL;
	}
	return NULL;
}
int Sprite_getChildIndex(Sprite*this,Sprite*child)
{
	if(this && this->numChildren>0 && child && child->parent==this){
		int _i=0;
		Sprite*_child=this->children;
		while(_child) {
			if(_child==child)
				return _i;
			_child=_child->next;
			++_i;
		}
	}
	return -1;
}
int Sprite_swapChildren(Sprite*this,Sprite*child1,Sprite*child2)
{
	if(child1 && child2 && this && this == child1->parent && this == child2->parent)
	{
		Sprite _child;
		_child.prev = child1->prev;
		_child.next = child1->next;
		child1->prev = child2->prev;
		child1->next = child2->next;
		child2->prev = _child->prev;
		child2->next = _child->next;
		if(this->children==child1)this->children=child2;
		else if(this->children==child2)this->children=child1;
		return 0;
	}
	return -1;
}
int Sprite_swapChildrenAt(Sprite*this,int child1,int child2)
{
	if(this==null)return -1;
	Sprite*_child1=Sprite_getChildAt(this,child1);
	Sprite*_child2=Sprite_getChildAt(this,child2);
	if(_child1 && _child2)
	{
		return Sprite_swapChildren(this,_child1,_child2);
	}
	return -2;
}
Sprite *Sprite_setChildIndex(Sprite*this,Sprite*child,int i)
{
	if(this && child && child->parent==this && i >=0 && i<this->numChildren)
	{
		return Sprite_swapChildren(this,child,Sprite_getChildAt(this,i));
	}
	return NULL;
}
int Sprite_localToGlobal(Sprite*this,float lx,float ly,float *gx,float* gy)
{
	if(this==null)
		return -1;
	*gx = lx;
	*gy = ly;
	*gx += this->x;
	*gy += this->y;
	Sprite*parent = this->parent;
	while(parent){
		*gx *= parent->scaleX;
		*gy *= parent->scaleY;
		*gx += parent->x;
		*gy += parent->y;
		parent = parent->parent;
	}
	return 0;
}
int Sprite_globalToLocal(Sprite*this,float gx,float gy,float *lx,float* ly)
{
	if(this==null)
		return -1;
	*lx = gx;
	*ly = gy;
	*lx -= this->x;
	*ly -= this->y;
	Sprite*parent = this->parent;
	while(parent){
		*lx /= parent->scaleX;
		*ly /= parent->scaleY;
		*lx -= parent->x;
		*ly -= parent->y;
		parent = parent->parent;
	}
	return 0;
}
int Sprite_globalToLocal3D(Sprite*this,float gx,float gy,float* lx,float *ly ,float*lz)
{//2d->3d映射
	return 0;
}
int Sprite_local3DToGlobal(Sprite*this,float lx,float ly,float lz,float* gx,float* gy)
{//3d-2d映射
	return 0;
}
/*
   int (*addEventListener)(char*, void (void*)(char*)); //用 EventDispatcher 对象注册事件侦听器对象，以使侦听器能够接收事件通知。 EventDispatcher 
   int (*hasEventListener)(char *type);//查 EventDispatcher 对象是否为特定事件类型注册了任何侦听器。 EventDispatcher 
   int (*dispatchEvent)(char*);//事件调度到事件流中。 EventDispatcher 
   SDL_rectangle (*getBounds)();//回一个矩形，该矩形定义相对于 targetCoordinateSpace 对象坐标系的显示对象区域。 DisplayObject 
//int areInaccessibleObjectsUnderPoint(point:Point);//示安全限制是否会导致出现以下情况：在列表中忽略了使用指定 point 点调用 DisplayObjectContainer.getObjectsUnderPoint() 方法时返回的所有显示对象。 DisplayObjectContainer 
int(*getObjectsUnderPoint)(point:Point);//回对象的数组，这些对象位于指定点下，并且是该 DisplayObjectContainer 实例的子项（或孙子项，依此类推）。 DisplayObjectContainer 
SDL_rectangle*(*getRect)(targetCoordinateSpace:DisplayObject);//回一个矩形，该矩形根据 targetCoordinateSpace 参数定义的坐标系定义显示对象的边界，但不包括形状上的任何笔触。 DisplayObject 
//int hasOwnProperty(name:String);//示对象是否已经定义了指定的属性。 Object 
//int hitTestObject(obj:DisplayObject);//算显示对象的边框，以确定它是否与 obj 显示对象的边框重叠或相交。 DisplayObject 
//int hitTestPoint(x:Number, y:Number, shapeFlag:Boolean = false);//算显示对象，以确定它是否与 x 和 y 参数指定的点重叠或相交。 DisplayObject 
//int isPrototypeOf(theClass:Object);//示 Object 类的实例是否在指定为参数的对象的原型链中。 Object 
//int (*propertyIsEnumerable)(name:String);//示指定的属性是否存在、是否可枚举。 Object 
int (*removeEventListener)(type:String, listener:Function, useCapture:Boolean = false);// EventDispatcher 对象中删除侦听器。 EventDispatcher 
int (*setPropertyIsEnumerable)(name:String, isEnum:Boolean = true);//置循环操作动态属性的可用性。 Object 
int (*startTouchDrag)(touchPointID:int, lockCenter:Boolean = false, bounds:Rectangle = null);//用户可以在启用触摸的设备上拖动指定的 Sprite。 Sprite 
int (*stopTouchDrag)(touchPointID:int);//束 startTouchDrag() 方法，用于启用触摸的设备。 Sprite 
//toLocaleString();//回此对象的字符串表示形式，其格式设置遵守区域设置特定的约定。 Object 
//toString();//回指定对象的字符串表示形式。 Object 
//valueOf();//回指定对象的原始值。 Object 
int (willTrigger)(char *type);//查是否用此 EventDispatcher 对象或其任何始祖为指定事件类型注册了事件侦听器。 
*/


